#[cfg(test)]
mod test {

    #[test]
    fn main() {
        /*
        错误代码
        let mut data = 42;
        let ref1 = &data; // 不可变引用
        let ref2 = &mut data; // 可变引用
        println!("{}", ref1); // 错误！不可变引用和可变引用不能同时存在
         */
        let mut data = 42;
        let ref1 = &data; // 不可变引用
        println!("{}", ref1); // 先使用不可变引用

        let ref2 = &mut data; // 可变引用
        *ref2 += 1; // 修改数据
        println!("{}", ref2); // 使用可变引用
    }
}
/*
在 Rust 中，可变引用（&mut T）和不可变引用（&T）不能同时存在，这是 Rust 所有权系统的一个重要规则，目的是保证内存安全和数据竞争的安全性。以下是详细解释：

1. 数据竞争的定义
数据竞争（Data Race）是指以下情况同时发生：

两个或多个线程同时访问同一块内存。

至少有一个线程在写数据。

没有同步机制来保护这些访问。

数据竞争会导致未定义行为（Undefined Behavior），例如程序崩溃、数据损坏或安全漏洞。

2. Rust 的引用规则
Rust 通过严格的引用规则来防止数据竞争：

（1）不可变引用（&T）
可以有多个不可变引用。

不可变引用只允许读取数据，不能修改数据。

（2）可变引用（&mut T）
只能有一个可变引用。

可变引用允许读写数据。

（3）引用规则总结
规则 1：要么只能有一个可变引用，要么可以有多个不可变引用，但不能同时存在可变引用和不可变引用。

规则 2：引用必须始终有效（即不能悬空引用）。

3. 为什么不能同时存在可变引用和不可变引用？
（1）防止数据竞争
如果允许同时存在可变引用和不可变引用，可能会导致以下问题：

一个线程通过不可变引用读取数据。

另一个线程通过可变引用修改数据。

这会导致数据竞争，因为读取和修改同时发生，且没有同步机制。

（2）保证内存安全
Rust 的所有权系统通过编译时检查，确保以下两点：

数据不会被意外修改。

数据不会被多个线程同时修改。
 */